import 'package:dio/dio.dart';

class SokachRequest {
  // 声明dio
  Dio? _dio;

  // 1.私有的静态属性
  static SokachRequest? _instance;

  // 2.私有的命名构造函数
  SokachRequest._initRequest() {
    // 创建dio实例
    if (_dio == null) {
      // 设置全局的options配置信息
      BaseOptions options = BaseOptions(
          //链接超时时间14秒
          connectTimeout: Duration(seconds: 15),
          //响应超时时间5秒
          receiveTimeout: Duration(seconds: 5),
          // 基地址
          baseUrl: 'https://pcapi-xiaotuxian-front.itheima.net/');
      _dio = Dio(options);

      // dio拦截器配置
      _dio!.interceptors.add(InterceptorsWrapper(
        // 请求拦截器
        onRequest: (
          RequestOptions options,
          RequestInterceptorHandler handler,
        ) {
          // 发送请求前进行一些逻辑处理写在这里

          // 配置请求头信息
          options.headers = {
            // 用户身份信息
            "Authorization": '',
            // 客户端类型
            "source-client": 'app',
          };

          return handler.next(options);
        },

        // 响应拦截器
        onResponse: (
          Response e,
          ResponseInterceptorHandler handler,
        ) {
          // 对响应的数据进行一些处理(如过滤筛选数据)

          return handler.next(e);
        },

        // 异常处理
        onError: (
          DioError e,
          ErrorInterceptorHandler handler,
        ) {
          //捕捉到异常的操作拦截(如身份信息过期等)

          return handler.next(e);
        },
      ));
    }
  }

  //3.创建单例对象（工厂构造函数）
  factory SokachRequest() {
    if (_instance == null) {
      // 判断单例对象是否存在
      _instance = SokachRequest._initRequest();
    }

    return _instance!;
  }

  // 处理请求的公共方法
  Future<Response> handldeRequest(String path, String method,
      {data, Map<String, dynamic>? queryParameters}) {
    return _dio!.request(
      path,
      data: data,
      queryParameters: queryParameters,
      options: Options(method: method),
    );
  }
}
